Debugging is a methodical process of finding and reducing the number of bugs, or defects, in a computer program or a piece of electronic hardware. Debugging ranges in complexity from fixing simple errors to performing lengthy and tiresome tasks of data collection, analysis, and scheduling updates. The debugging skill of the programmer can be a major factor in the ability to debug a problem, but the difficulty of software debugging varies greatly with the complexity of the system, and also depends to some extent, on the programming language(s) used and the available tools, such as debuggers. Debuggers are software tools which enable the programmer to monitor the execution of a program, stop it, restart it, set breakpoints and change values in memory.
One of the possible debugging tools used by programmers and software engineers is to modify an instruction stream by replacing an instruction with an exception or a branch that allows the debugger to take control of the program. However, for certain debug applications, it is not possible or desirable to modify the instruction stream in this manner. In these cases, programmers may utilize a Completion Instruction Address Breakpoint Register (CIABR). A CIABR allows the debugger to specify an instruction address, which when hit will cause an interrupt that will transfer control to the debugger.